package dbUtil;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class ToBean {
    //创建bean的实例
    public static Object createBean(ResultSet rs,Class<?> type) throws SQLException{
        Object bean = null;
        try {
            bean = type.newInstance();
            //获取结果集的所有列数和列名
            ResultSetMetaData meta=rs.getMetaData();
            //遍历列的长度(也就是几个字段就循环几次)
            for (int i=1;i<=meta.getColumnCount();i++){
                //根据遍历 来获取列的名字
                String ColumnName=meta.getColumnName(i);
                //把每个列名的值映射在bean的属性中
                setValues(rs,ColumnName,type,bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
    private static void setValues(ResultSet rs,String columnName,Class<?> type, Object bean) throws SQLException, IllegalAccessException {
        Field[] fiels = type.getDeclaredFields();
        for (Field f:fiels) {
            //打开开关
            f.setAccessible(true);
            //判断字段里面是否有column这个注解
            String fieldName = f.isAnnotationPresent(Column.class) ? f.getAnnotation(Column.class).value() : f.getName();
            //有这个注解就获取注解里面的值
            //如果注解里面的值和表里面的列名一样
            if (columnName.equalsIgnoreCase(fieldName)){
                //先判断字段的类型
                Object o = ColumnUtil.columnType(rs,columnName, f);
                f.set(bean,o);
                break;
            }
        }

    }
}
